package com.monika.main.system.util;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.function.ConverterFileName;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * MyBatis-Plus 代码生成器
 */
public class CodeGenerator {

    // 数据库连接配置
    private static final String URL = "jdbc:mysql://localhost:3306/primal?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";

    private static final String USERNAME = "root";
    private static final String PASSWORD = "whh123";
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";

    // 项目路径配置
    private static final String PROJECT_PATH = System.getProperty("user.dir");
    private static final String PACKAGE_PARENT = "com.monika.sys"; // 父包名
    private static final String MODULE_NAME = "user"; // 模块名
    private static final String AUTHOR = "your name"; // 作者

    // 输出路径配置
    private static final String ENTITY_OUTPUT_DIR = PROJECT_PATH + "/src/main/java/" +
            PACKAGE_PARENT.replace(".", "/") + "/" + MODULE_NAME + "/entity";
    private static final String MAPPER_OUTPUT_DIR = PROJECT_PATH + "/src/main/java/" +
            PACKAGE_PARENT.replace(".", "/") + "/" + MODULE_NAME + "/mapper";
    private static final String SERVICE_OUTPUT_DIR = PROJECT_PATH + "/src/main/java/" +
            PACKAGE_PARENT.replace(".", "/") + "/" + MODULE_NAME + "/service";
    private static final String CONTROLLER_OUTPUT_DIR = PROJECT_PATH + "/src/main/java/" +
            PACKAGE_PARENT.replace(".", "/") + "/" + MODULE_NAME + "/controller";
    private static final String MAPPER_XML_OUTPUT_DIR = PROJECT_PATH + "/src/main/resources/mapper/" + MODULE_NAME;

    public static void main(String[] args) {
        // 要生成代码的表名
        String[] tables = {"sys_user"};

        generateCode(tables);
    }

    /**
     * 生成代码
     * @param tables 表名数组
     */
    public static void generateCode(String[] tables) {
        // 数据源配置
        DataSourceConfig.Builder dataSourceConfig = new DataSourceConfig.Builder(URL, USERNAME, PASSWORD);


        // 代码生成器
        FastAutoGenerator.create(dataSourceConfig)
                // 全局配置
                .globalConfig(builder -> {
                    builder.author(AUTHOR) // 设置作者
//                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .dateType(DateType.TIME_PACK) // 使用 java8 新时间类型
                            .commentDate("yyyy-MM-dd") // 注释日期
                            .outputDir(PROJECT_PATH + "/src/main/java"); // 指定输出目录
                })
                // 包配置
                .packageConfig(builder -> {
                    builder.parent(PACKAGE_PARENT) // 父包名
                            .moduleName(MODULE_NAME) // 父包模块名
                            .entity("entity") // 实体类包名
                            .mapper("mapper") // mapper接口包名
                            .service("service") // service包名
                            .serviceImpl("service.impl") // service实现类包名
                            .controller("controller") // controller包名
                            .xml("mapper.xml") // mapper xml包名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, MAPPER_XML_OUTPUT_DIR)); // 配置mapper.xml路径信息
                })
                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(tables) // 设置需要生成的表名
//                            .addTablePrefix("t_", "sys_") // 设置过滤表前缀
                            // 实体类策略配置
                            .entityBuilder()
                            .enableLombok() // 开启 Lombok
                            .enableChainModel() // 开启链式模型
                            .enableTableFieldAnnotation() // 开启生成字段注解
                            .logicDeleteColumnName("deleted") // 逻辑删除字段名
                            .versionColumnName("version") // 乐观锁字段名

                            // Controller策略配置
                            .controllerBuilder()
                            .enableRestStyle() // 开启RestController注解
                            .enableHyphenStyle() // 开启驼峰转连字符

                            // Service策略配置
                            .serviceBuilder()
                            .formatServiceFileName("%sService")
                            .formatServiceImplFileName("%sServiceImpl")

                            // Mapper策略配置
                            .mapperBuilder()
                            .superClass(BaseMapper.class) // 设置父类
                            .enableBaseResultMap() // 启用BaseResultMap生成
                            .enableBaseColumnList() // 启用BaseColumnList
                            .formatMapperFileName("%sMapper")
                            .formatXmlFileName("%sMapper");
                })
                // 模板配置
                .templateEngine(new FreemarkerTemplateEngine())
                // 执行生成
                .execute();
    }
}
